home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 014 / libtools.arc / CAPSTATE.AQM / CAPSTATE.ASM
Encoding:
Assembly Source File  |  1984-04-20  |  3.7 KB  |  101 lines

  1. TITLE CAPSTATE - Display state of CapsLock and NumLock keys
  2.          PAGE  63,132
  3. ;
  4. ; Progam CAPSTATE.ASM  (CAPSTATE.COM)
  5. ;
  6. ; Author: Larry Bradley
  7. ;         Ottawa, Canada
  8. ;         February 5, 1984
  9. ;
  10. ;        This program is a version of KEYFLAGS by Morton Kaplan
  11. ;        (see PC World Vol. 1 No. 7, Oct. 1983 pp 266-271)
  12. ;        This version does not use BIOS calls to display the state
  13. ;        of the CapsLock and NumLock keys, but writes directly
  14. ;        to the display buffer (for mono or color). This solves
  15. ;        the problem of incompatibility with SCROLLK rpogram.
  16. ;
  17. ;        This program displays an up arrow for caps lock and a
  18. ;        number sign for numlock, intensified, in row 0, cols 78 & 79.
  19. ;        The variable STATE_POSN gives the display buffer address where
  20. ;        the display is to start, thus it may easily be changed.
  21. ;
  22. ;        After assembling and linking this module, use EXE2BIN
  23. ;        to create a COM module. This version only works with
  24. ;        DOS 2.0, since DOS function 35 is used to get the old
  25. ;        interrupt vector. It could be changed to get the vector
  26. ;        directly.
  27. ;
  28. DATA     SEGMENT AT 40H           ;BIOS DATA AREAS
  29.                ORG   10H
  30. EQUIP_FLAG     DW  ?              ;TO CHECK IF MONO/COLOR DISPLAY
  31.                ORG   17H
  32. KB_FLAG        DB  ?
  33. CAPS_STATE     EQU 40H
  34. NUM_STATE      EQU 20H
  35. DATA     ENDS
  36. ;
  37. CODE     SEGMENT
  38.          ASSUME  CS:CODE,DS:DATA
  39.          ORG   100H
  40. START:   JMP   INIT
  41. ;
  42. OLD_KB_INT     DD  ?              ;SAVE OLD KEYBOARD INTERRUPT VECTOR
  43. STATE_POSN     EQU 156            ;ROW 0 COL 78 (REGEN ADDRESS)
  44. ;
  45. KB_INT   PROC  FAR
  46.          STI
  47.          PUSHF
  48.          CALL  OLD_KB_INT         ;INVOKE ROM ROUTINE TO READ KEYBOARD
  49.          PUSH  DS
  50.          PUSH  ES
  51.          PUSH  AX
  52.          PUSH  BX
  53.          PUSH  DI
  54.          MOV   AX,40H
  55.          MOV   DS,AX              ;DS -> ROM BIOS DATA
  56.          MOV   AX,0B800H          ;ASSUME COLOR DISPLAY
  57.          MOV   BX,EQUIP_FLAG
  58.          AND   BX,30H
  59.          CMP   BX,30H             ;IS IT?
  60.          JNE   COLOR              ;YES
  61.          MOV   AX,0B000H          ;NO, MONOCHROME
  62. COLOR:   MOV   ES,AX              ;SET REGEN ADDRESS
  63.          MOV   DI,STATE_POSN      ;WHERE TO PUT THE INDICATORS ON THE SCREEN
  64.          MOV   AX,0720H           ;ASSUME NO CAPS:NORMAL ATTR+BLANK
  65.          TEST  KB_FLAG,CAPS_STATE      ;IS IT?
  66.          JE    NOCAPS             ;NOT CAPS, JUMP
  67.          MOV   AX,0F18H           ;CAPS:BRIGHT ATTR+UP ARROW
  68. NOCAPS:  STOSW                    ;WRITE IT TO DISPLAY BUFFER
  69.          MOV   AX,0720H           ;ASSUME NOT NUMLOCK: NORMAL ATTR+BLANK
  70.          TEST  KB_FLAG,NUM_STATE       ;IS IT?
  71.          JE    NONUM              ;NOT NUMLOCK, JUMP
  72.          MOV   AX,0F23H           ;NUMLOCK:BRIGHT PLUS # SIGN
  73. NONUM:   STOSW                    ;WRITE IT TO DISPLAY
  74.          POP   DI
  75.          POP   BX
  76.          POP   AX
  77.          POP   ES
  78.          POP   DS
  79.          IRET
  80. KB_INT   ENDP
  81. ;
  82. ;        INITIALIZATION CODE.
  83. ;        SAVE OLD INTERRUPT 9 VECTOR, SET NEW ONE.
  84. ;
  85.          ASSUME  CS:CODE,DS:CODE
  86. INIT:    MOV   AL,9               ;GET INTERRUPT VECTOR
  87.          MOV   AH,35H             ;FOR INTTERRUPT 9
  88.          INT   21H                ;THE KEYBOARD INTERRUPT
  89.          MOV   OLD_KB_INT+2,ES    ;SAVE OLD CS
  90.          MOV   OLD_KB_INT,BX      ;SAVE OLD IP
  91.          MOV   DX,OFFSET KB_INT   ;NEW IP FOR INTERRUPT
  92.          MOV   AL,9               ;SET NEW INTERRUPT VECTOR
  93.          MOV   AH,25H             ;FOR INTERRUPT 9
  94.          INT   21H
  95.          MOV   DX,OFFSET INIT     ;LAST BYTE IN INTERRUPT ROUTINE
  96.          INT   27H                ;TERMINATE, STAY RESIDENT
  97. CODE     ENDS
  98.          END   START
  99.  
  100. *** CREATED 02/06/84 19:47:32 BY NRC ***
  101.